package org.ht.util;

import java.text.ParseException;
import java.util.Calendar;
import java.util.Date;

/**
 *
 * @author Issao Hanaoka Junior
 */
public class ValidadorData {

    public static final int A_ANTES_DE_B = 1;
    public static final int B_ANTES_DE_A = 2;
    public static final int B_DEPOIS_DE_A = 1;
    public static final int A_DEPOIS_DE_B = 2;
    public static final int A_IGUAL_B = 0;
    public static final int DATA_INVALIDA = -1;

    private ValidadorData() {
    }

    public static boolean dataNascValida(String dataStr, int idadeMinima, int idadeMaxima) throws ParseException {

        // convertendo dataStr para Date
        Date data = FormatadorData.getData(dataStr);

        // caso o formato da data seja inválido
        if (data == null) {
            return false;
        }

        // define-se a data a ser validada
        Calendar dataValidada = Calendar.getInstance();
        dataValidada.setTime(data);

        // definindo a data maior, ou mais recente possivel
        // consiste na data atual menos a idade minima do cliente
        Calendar dataMax = Calendar.getInstance();
        dataMax.add(Calendar.YEAR, -idadeMinima);

        // definindo a data menor, ou mais antiga possivel
        // corresponde a data atual menos a idade maxima do cliente
        Calendar dataMin = Calendar.getInstance();
        dataMin.add(Calendar.YEAR, -(idadeMaxima + 1));

        // a data validanda deve ser maior ou igual a data minima ou menor ou
        // igual a data maxima
        boolean dataValidadaDepoisDeDataMin = dataValidada.after(dataMin);
        boolean dataValidadaAntesDeDataMax = dataValidada.before(dataMax);


        if (dataValidadaDepoisDeDataMin && dataValidadaAntesDeDataMax) {
            return true;
        } else {
            return false;
        }
    }

    public static boolean dataNascValida(Date dataStr, int idadeMinima, int idadeMaxima) {

        // convertendo dataStr para Date
        Date data = dataStr;

        // caso o formato da data seja inválido
        if (data == null) {
            return false;
        }

        // define-se a data a ser validada
        Calendar dataValidada = Calendar.getInstance();
        dataValidada.setTime(data);

        // definindo a data maior, ou mais recente possivel
        // consiste na data atual menos a idade minima do cliente
        Calendar dataMax = Calendar.getInstance();
        dataMax.add(Calendar.YEAR, -idadeMinima);

        // definindo a data menor, ou mais antiga possivel
        // corresponde a data atual menos a idade maxima do cliente
        Calendar dataMin = Calendar.getInstance();
        dataMin.add(Calendar.YEAR, -(idadeMaxima + 1));

        // a data validanda deve ser maior ou igual a data minima ou menor ou
        // igual a data maxima
        boolean dataValidadaDepoisDeDataMin = dataValidada.after(dataMin);
        boolean dataValidadaAntesDeDataMax = dataValidada.before(dataMax);


        if (dataValidadaDepoisDeDataMin && dataValidadaAntesDeDataMax) {
            return true;
        } else {
            return false;
        }
    }

    public static String getDataNascMin(int idadeMaxima) {
        // definindo a data menor, ou mais antiga possivel
        // corresponde a data atual menos a idade maxima do cliente
        Calendar dataMin = Calendar.getInstance();
        dataMin.add(Calendar.YEAR, -(idadeMaxima + 1));
        return FormatadorData.getStringData(dataMin.getTime());
    }

    public static String getDataNascMax(int idadeMinima) {
        // definindo a data maior, ou mais recente possivel
        // consiste na data atual menos a idade minima do cliente
        Calendar dataMax = Calendar.getInstance();
        dataMax.add(Calendar.YEAR, -idadeMinima);
        return FormatadorData.getStringData(dataMax.getTime());
    }

    public static int comparaDatas(String A, String B) throws ParseException {
        // convertendo dataStr para Date
        Date dateA = FormatadorData.getData(A);
        Date dateB = FormatadorData.getData(B);

        // caso o formato da data seja inválido
        if (dateA == null || dateB == null) {
            return DATA_INVALIDA;
        }


        // definem-se as datas a serem validadas
        Calendar calendarA = Calendar.getInstance();
        calendarA.setTime(dateA);
        Calendar calendarB = Calendar.getInstance();
        calendarB.setTime(dateB);

        int resultComparacao = calendarA.compareTo(calendarB);

        if (resultComparacao == 0) {
            return A_IGUAL_B;
        } else if (resultComparacao < 0) {
            return A_ANTES_DE_B;
        } else {
            return A_DEPOIS_DE_B;
        }
    }

    public static int comparaDatas(Date dateA, Date dateB) {

        // caso o formato da data seja inválido
        if (dateA == null || dateB == null) {
            return DATA_INVALIDA;
        }


        // definem-se as datas a serem validadas
        Calendar calendarA = Calendar.getInstance();
        calendarA.setTime(dateA);
        Calendar calendarB = Calendar.getInstance();
        calendarB.setTime(dateB);

        int resultComparacao = calendarA.compareTo(calendarB);

        if (resultComparacao == 0) {
            return A_IGUAL_B;
        } else if (resultComparacao < 0) {
            return A_ANTES_DE_B;
        } else {
            return A_DEPOIS_DE_B;
        }
    }

    public static Date getDataAnosAtras(int anosAtras) {
        Calendar dataBase = Calendar.getInstance();
        dataBase.add(Calendar.YEAR, -(anosAtras));

        return dataBase.getTime();
    }
}
